package org.jsola.contract.service;

import org.jsola.contract.dao.ISealPositionDAO;
import org.jsola.contract.dto.SealPositionAddDTO;
import org.jsola.contract.dto.SealPositionUpdateDTO;
import org.jsola.contract.entity.SealPositionDO;
import org.jsola.contract.query.SealPositionQuery;
import org.jsola.contract.vo.SealPositionListVO;
import org.jsola.contract.vo.SealPositionVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 合同默认签章位置
 *
 * @author JanusMix
 */
public interface ISealPositionService extends IService<ISealPositionDAO, SealPositionDO> {

    /**
     * 新增合同默认签章位置
     *
     * @param sealPositionAddDTO 新增合同默认签章位置DTO
     * @param tokenUser          当前用户
     * @return 合同默认签章位置详情信息
     */
    SealPositionVO save(SealPositionAddDTO sealPositionAddDTO, TokenUser tokenUser);

    /**
     * 新增/修改合同默认（删除原有 重新添加）
     *
     * @param sealPositionAddDTOList 新增合同默认签章位置DTO
     * @param tokenUser              当前用户
     * @return 合同默认签章位置详情信息
     */
    List<SealPositionVO> saveOrUpdate(List<SealPositionAddDTO> sealPositionAddDTOList, TokenUser tokenUser);

    /**
     * 根据模板id  新增/修改合同默认签章位置（删除原有 重新添加）
     *
     * @param sealPositionAddDTOList 新增合同默认签章位置DTO
     * @param tokenUser              当前用户
     * @return 合同默认签章位置详情信息
     */
    List<SealPositionVO> saveOrUpdate(Long templateId, List<SealPositionAddDTO> sealPositionAddDTOList, TokenUser tokenUser);


    /**
     * 批量新增合同默认签章位置
     *
     * @param sealPositionAddDTOList 新增合同默认签章位置DTO
     * @param tokenUser              当前用户
     * @return 合同默认签章位置详情信息
     */
    List<SealPositionVO> batchSave(List<SealPositionAddDTO> sealPositionAddDTOList, TokenUser tokenUser);

    /**
     * 修改合同默认签章位置
     *
     * @param sealPositionUpdateDTO 修改合同默认签章位置DTO
     * @param tokenUser             当前用户
     * @return 更新数量
     */
    int update(SealPositionUpdateDTO sealPositionUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除合同默认签章位置，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser       当前用户
     * @param sealPositionIds 合同默认签章位置id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... sealPositionIds);

    /**
     * 根据合同默认签章位置id查找
     *
     * @param sealPositionId 合同默认签章位置id
     * @param siteId         所属站点id
     * @return 合同默认签章位置详情信息
     */
    SealPositionVO selectById(Long sealPositionId, String siteId);

    /**
     * 查询合同默认签章位置
     *
     * @param sealPositionQuery 查询条件
     * @param siteId            所属站点id
     * @return 合同默认签章位置列表信息
     */
    List<SealPositionListVO> select(SealPositionQuery sealPositionQuery, String siteId);

    /**
     * 查询合同默认签章位置记录数
     *
     * @param sealPositionQuery 查询条件
     * @param siteId            所属站点id
     * @return 合同默认签章位置记录数
     */
    int selectCount(SealPositionQuery sealPositionQuery, String siteId);

    /**
     * 分页查询合同默认签章位置
     *
     * @param sealPositionQuery 查询条件
     * @param siteId            所属站点id
     * @return 合同默认签章位置列表信息
     */
    Page<SealPositionListVO> selectPage(SealPositionQuery sealPositionQuery, String siteId);


    /**
     * 根据合同默认签章位置id查找
     *
     * @param sealPositionId 合同默认签章位置id
     * @param siteId         所属站点id
     * @return 合同默认签章位置
     */
    SealPositionDO selectDOById(Long sealPositionId, String siteId);

    /**
     * 查询合同默认签章位置
     *
     * @param sealPositionQuery 查询条件
     * @param siteId            所属站点id
     * @return 合同默认签章位置列表
     */
    List<SealPositionDO> selectDO(SealPositionQuery sealPositionQuery, String siteId);

    /**
     * 查询模板所有印章位置
     *
     * @param templateId 模板id
     * @param siteId     站点id
     * @return 合同默认签章位置列表
     */
    List<SealPositionDO> selectByTemplateId(Long templateId, String siteId);

    /**
     * 查询模板所有印章位置
     *
     * @param templateIds 模板id
     * @param siteId      站点id
     * @return 合同默认签章位置列表
     */
    List<SealPositionDO> selectByTemplateIds(List<Long> templateIds, String siteId);

    /**
     * 查询模板某个账户类型的印章位置
     *
     * @param templateId  模板id
     * @param accountType 账户类型
     * @param siteId      站点id
     * @return 合同默认签章位置列表
     */
    List<SealPositionDO> selectByTemplateIdAndAccountType(Long templateId, Integer accountType, String siteId);

    /**
     * 对于签章位置大于pdf总页码数的,修改签章页为最大页码
     *
     * @param templateId 模板id
     * @param totalPage  模板pdf总页码数
     * @param tokenUser  当前用户
     */
    void updateMaxSealPage(Long templateId, Integer totalPage, TokenUser tokenUser);
}


